bitkeeper revision 1.1011.1.5 (40db0dbbPeQLwub6SrW6h5ORlAC4SA)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Thu, 24 Jun 2004 17:22:03 +0000 (17:22 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Thu, 24 Jun 2004 17:22:03 +0000 (17:22 +0000)
Add trace support to new xend.

tools/xenmgr/lib/server/SrvConsoleServer.py
tools/xenmgr/xend

index 94b7c8e6c8aaa1962b14abbf2c58bd9a693248d6..7a8e4b96d8fdd5ea5558c78649d684287698132c 100644 (file)
@@ -8,6 +8,8 @@ import os
 import os.path
 import signal
 import sys
+import threading
+import linecache
 import socket
 import pwd
 import re
@@ -482,7 +484,7 @@ class Daemon:
         while code > 0:
             code = os.waitpid(-1, os.WNOHANG)
 
-    def start(self):
+    def start(self,trace=0):
         if self.cleanup(kill=False):
             return 1
 
@@ -506,9 +508,54 @@ class Daemon:
         # Child
         logfile = self.open_logfile()
         self.redirect_output(logfile)
+        if trace:
+            self.tracefile = open('/var/log/xend.trace', 'w+', 1)
+            self.traceindent = 0
+            sys.settrace(self.trace)
+            try:
+                threading.settrace(self.trace) # Only in Python >= 2.3
+            except:
+                pass
         self.run()
         return 0
 
+    def print_trace(self,str):
+        for i in range(self.traceindent):
+            self.tracefile.write("    ")
+        self.tracefile.write(str)
+            
+    def trace(self, frame, event, arg):
+        if event == 'call':
+            code = frame.f_code
+            filename = code.co_filename
+            m = re.search('.*xenmgr/(.*)', code.co_filename)
+            if not m:
+                return None
+            modulename = m.group(1)
+            if re.search('sxp.py', modulename):
+                return None
+            self.traceindent += 1
+            self.print_trace("++++ %s:%s\n"
+                             % (modulename, code.co_name))
+        elif event == 'line':
+            filename = frame.f_code.co_filename
+            lineno = frame.f_lineno
+            self.print_trace("%4d %s" %
+                             (lineno, linecache.getline(filename, lineno)))
+        elif event == 'return':
+            code = frame.f_code
+            filename = code.co_filename
+            m = re.search('.*xenmgr/(.*)', code.co_filename)
+            if not m:
+                return None
+            modulename = m.group(1)
+            self.print_trace("---- %s:%s\n"
+                             % (modulename, code.co_name))
+            self.traceindent -= 1
+        elif event == 'exception':
+            pass
+        return self.trace
+
     def open_logfile(self):
         if not os.path.exists(CONTROL_DIR):
             os.makedirs(CONTROL_DIR)
index e575eeccd561552a105e5a3988b7faa778ff37a7..72b6d307f6bd3ea9931fb1ed5f2803fae26a728e 100644 (file)
@@ -29,6 +29,8 @@ def main():
         return status >> 8
     elif sys.argv[1] == 'start':
         return daemon.start()
+    elif sys.argv[1] == 'trace_start':
+        return daemon.start(trace=1)
     elif sys.argv[1] == 'stop':
         return daemon.stop()
     elif sys.argv[1] == 'restart':